/**
 * 同步缩放配置
 */
export interface SyncConfig {
  // 节流配置
  throttleDelay: number      // 节流间隔（毫秒）
  
  // 防抖配置
  debounceDelay: number      // 防抖间隔（毫秒）
  
  // 同步状态清除延迟
  syncStateDelay: number     // 同步状态清除延迟（毫秒）
  
  // 性能优化选项
  enableBatchSync: boolean   // 是否启用批量同步
  maxSyncRetries: number     // 最大重试次数
  
  // 用户体验选项
  enableSmoothSync: boolean  // 是否启用平滑同步
  enableDebugLog: boolean    // 是否启用调试日志
}

/**
 * 预设配置
 */
export const SYNC_PRESETS = {
  // 高性能模式 - 最快响应，可能有轻微抖动
  performance: {
    throttleDelay: 50,
    debounceDelay: 100,
    syncStateDelay: 30,
    enableBatchSync: true,
    maxSyncRetries: 3,
    enableSmoothSync: false,
    enableDebugLog: false
  } as SyncConfig,

  // 平衡模式 - 性能和稳定性的平衡（推荐）
  balanced: {
    throttleDelay: 100,
    debounceDelay: 150,
    syncStateDelay: 50,
    enableBatchSync: true,
    maxSyncRetries: 3,
    enableSmoothSync: true,
    enableDebugLog: false
  } as SyncConfig,

  // 稳定模式 - 最稳定，减少抖动，响应稍慢
  stable: {
    throttleDelay: 150,
    debounceDelay: 200,
    syncStateDelay: 80,
    enableBatchSync: true,
    maxSyncRetries: 5,
    enableSmoothSync: true,
    enableDebugLog: false
  } as SyncConfig,

  // 调试模式 - 用于开发和调试
  debug: {
    throttleDelay: 200,
    debounceDelay: 300,
    syncStateDelay: 100,
    enableBatchSync: false,
    maxSyncRetries: 1,
    enableSmoothSync: false,
    enableDebugLog: true
  } as SyncConfig
}

/**
 * 同步配置管理器
 */
export class SyncConfigManager {
  private static readonly CONFIG_KEY = 'sync_config'
  private static readonly PRESET_KEY = 'sync_preset'
  private static readonly DEFAULT_PRESET = 'balanced'

  /**
   * 获取当前配置
   */
  static getCurrentConfig(): SyncConfig {
    try {
      // 首先尝试获取自定义配置
      const customConfig = this.getCustomConfig()
      if (customConfig) {
        return customConfig
      }

      // 如果没有自定义配置，使用预设
      const preset = this.getCurrentPreset()
      return SYNC_PRESETS[preset] || SYNC_PRESETS[this.DEFAULT_PRESET]
    } catch (error) {
      return SYNC_PRESETS[this.DEFAULT_PRESET]
    }
  }

  /**
   * 获取当前预设名称
   */
  static getCurrentPreset(): string {
    try {
      return localStorage.getItem(this.PRESET_KEY) || this.DEFAULT_PRESET
    } catch (error) {
      return this.DEFAULT_PRESET
    }
  }

  /**
   * 设置当前预设
   */
  static setCurrentPreset(preset: string): void {
    try {
      if (!SYNC_PRESETS[preset]) {
        throw new Error(`无效的预设配置: ${preset}`)
      }
      localStorage.setItem(this.PRESET_KEY, preset)
      // 清除自定义配置，使用预设
      localStorage.removeItem(this.CONFIG_KEY)
    } catch (error) {
    }
  }

  /**
   * 获取自定义配置
   */
  static getCustomConfig(): SyncConfig | null {
    try {
      const stored = localStorage.getItem(this.CONFIG_KEY)
      if (stored) {
        return JSON.parse(stored)
      }
    } catch (error) {
    }
    return null
  }

  /**
   * 保存自定义配置
   */
  static saveCustomConfig(config: SyncConfig): void {
    try {
      localStorage.setItem(this.CONFIG_KEY, JSON.stringify(config))
      // 清除预设标记，表示使用自定义配置
      localStorage.removeItem(this.PRESET_KEY)
    } catch (error) {
    }
  }

  /**
   * 重置为默认配置
   */
  static resetToDefault(): void {
    try {
      localStorage.removeItem(this.CONFIG_KEY)
      localStorage.removeItem(this.PRESET_KEY)
    } catch (error) {
    }
  }

  /**
   * 获取所有可用预设
   */
  static getAllPresets(): Record<string, SyncConfig> {
    return SYNC_PRESETS
  }

  /**
   * 验证配置有效性
   */
  static validateConfig(config: SyncConfig): boolean {
    try {
      return (
        typeof config.throttleDelay === 'number' && config.throttleDelay > 0 &&
        typeof config.debounceDelay === 'number' && config.debounceDelay > 0 &&
        typeof config.syncStateDelay === 'number' && config.syncStateDelay > 0 &&
        typeof config.enableBatchSync === 'boolean' &&
        typeof config.maxSyncRetries === 'number' && config.maxSyncRetries > 0 &&
        typeof config.enableSmoothSync === 'boolean' &&
        typeof config.enableDebugLog === 'boolean'
      )
    } catch (error) {
      return false
    }
  }
}

/**
 * 导出默认配置实例
 */
export const syncConfig = SyncConfigManager.getCurrentConfig()
